Surface — Design System

Brand, colour, type and UI system for Surface, a specialist SEO agency on the Gold Coast, Australia, driving growth for small and medium-sized businesses. Founded and run by David and Dara Rymarz. Positioning: we engineer search performance.

Sources this system was built from

Source What it gave us
surface-website/ (attached local codebase — Eleventy v2 static site, Firebase Hosting) Everything. All tokens, components and screens below are lifted from it.
surface-website/DESIGN-SYSTEM.md The agency's own written source of truth — voice, colour, type, buttons, spacing, component prefixes, the image-radius gotcha.
surface-website/css/surface.css (3,144 lines) The authoritative values. Where the doc and the CSS disagree, the CSS wins (see Known discrepancies).
surface-website/index.njk, _layouts/base.njk, case-studies/, insights/ Page structure, real copy, client results, FAQ content.
surface-website/images/, fonts/ Logos, client marks, photography, DM Sans binaries.
Live site https://surfaceagency.com.au

The published site is at https://surfaceagency.com.au. Contact: enquiry@surfaceagency.com.au · (1800) 975 399.


Products / surfaces

There is one product: the marketing website. It has five page types — homepage, service pages, case studies (listing + detail), insights (hub, pillar pages, articles), and utility pages (about, contact, FAQ, legal, digital business cards). There is no app, no dashboard, no logged-in product. The "Surface Engine" shown on the homepage is an internal SEO platform; only screenshots of it exist in the source.


Content fundamentals

Voice: confident, precise, understated. Surface engineers search performance — methodical, measurable, commercial. Never hype, never buzzwords, never exclamation marks.

Do not write: "unlock", "leverage", "supercharge", "game-changing", "in today's digital landscape", any em dash, any emoji, or a claim without a number behind it.


Visual foundations

Palette. Warm and earthy but restrained. Ink #0E0E0E on Paper #F1EFEB (bone off-white) carries almost everything. Terracotta #E49366 is the single accent — CTAs, the nav dot, the giant footer wordmark, and one section panel per page. Four muted panel tints rotate down a page for rhythm: blue-grey #BFCCD8, light sage #A8BFA0, sage #798E7B, dusty rose #BE91A3. Warm greys (#9A958C, #D8D2C8, #E8E3DA) handle borders and muted text. Maximum two background colours are in play at once; adjacent sections change colour rather than draw a divider.

Themes. Everything must work in body.light-mode (bone, the default for content) and body.dark-mode (near-black, used for the hero, contact, footer and case-study strips). Style through --bg / --text / --surface-border; never hardcode #000 or #fff on text.

Type. Owners Wide (Adobe Fonts) for every headline — weight 400, sentence case, letter-spacing: 2px, line-height: 0.95. DM Sans for body (16px / 1.6) and leads (18px / 1.6). Small labels are DM Sans 10px, weight 700, UPPERCASE, zero tracking. Nothing else. Headlines break by meaning with <br>, never to fill a line.

Corners. Square. A global reset forces border-radius: 0 !important on every image and picture. The only round shapes in the system are pill buttons (9999px), circular avatars (50%), and three deliberate exceptions: form fields and .btn-secondary at 6px, toasts and the guarantee banner at 12px, the modal card at 24px, and the "tablet" image frame at 30px outer / 14px inner.

Backgrounds. Flat colour only. No gradients anywhere except two functional ones: the sparkline area fill under result charts, and a linear-gradient(to top, rgba(0,0,0,.45), transparent) protection wash under text on full-bleed imagery. No patterns, no textures, no noise, no illustration.

Imagery. Real photography of real people — David and Dara at the desk, in meetings, on site. Warm natural light, no filters, no duotone, no black-and-white. Product shots are honest UI screenshots (SERP, AI visibility, local rankings). Full-bleed images fill half of a split section and stick (position: sticky; height: 100vh) while the copy column scrolls beside them. Screenshots that need framing get the white "tablet" treatment: #fff bezel, 20px padding, 30px radius, 0 30px 70px -30px rgba(0,0,0,0.28).

Borders and dividers. Hairline ink lines, never boxes. There are no borders between sections — the colour change is the separator. Within a section: horizontal rules are 2px and inset by the gutter at both ends; vertical column dividers are 1px and inset 36px top and bottom. Small list rows (article lists, takeaways) use 1px.

Cards have no card. Service, value, infrastructure and topic cards have no background, no border, no radius and no shadow — they are grid cells separated by inset hairlines. If you find yourself drawing a card outline, you have left the system.

Shadows. Almost none. Three exist: the tablet frame drop shadow above, 0 2px 24px rgba(0,0,0,0.06) on the frosted nav pill and trust toast, and -20px 0 60px rgba(0,0,0,0.1) on the open menu drawer. No inner shadows, ever.

Transparency and blur. Reserved for floating chrome only — the nav link pill, the trust toast, the menu backdrop (blur(8px)), the modal scrim (blur(20px)), and the small badge over philosophy images (blur(6px)). Content surfaces are always opaque.

Motion. Quiet. --transition-quiet: 250ms ease is the default for every hover. Reveals and panels ride cubic-bezier(0.16, 1, 0.3, 1): content fades in over 0.9s with a 40px rise, staggered children at 0.7s / 30px. Accordions animate grid-template-rows from 0fr to 1fr. No bounce, no spring, no scale-on-press. prefers-reduced-motion is respected everywhere.

Hover states. Buttons invert fill and text. Ghost links run a left-to-right underline wipe. Nav links grow an underline from the left. Dimmed elements return to full opacity (step numbers 0.1 → 1, ledger logos 0.6 → 1, article rows to 0.65). Images scale a restrained 1.02–1.04. Arrows shift 4px. There is no press/active state — Surface never shrinks or darkens on click.

Layout. Full-bleed sections with a responsive gutter (clamp(32px, 4vw, 80px), 20px on mobile) and a 1400px content maximum. Section padding is 140px vertical (60px on mobile). Grids are 4-across (stats, method, engine), 3-across (services, values), or 2-across (splits, insights topics). The nav is fixed and never opaque; the guarantee banner and trust toast are fixed bottom-left; the footer is revealed by the page sliding up over it.


Iconography

Surface has no icon set, and that is deliberate. There is no icon font, no sprite sheet, no Lucide/Heroicons dependency, and no PNG icons in the source. What exists:

Never add emoji, an icon library, or a decorative illustration. If a section needs a visual, it gets a photograph.

Brand assets live in assets/logos/: Surface-Icon.svg (the mark, 24px in the nav), Surface-Text.svg (the wordmark, masked in terracotta at full page width in the footer), Surface-Logo-Copyright.svg, Surface-Logo-Strapline.svg. Client marks are in assets/logos/clients/.


Components

Grouped by concern under components/. Every family below has a counterpart in css/surface.css — nothing here was invented.

buttons/ — Button (variants: pill, inverted, secondary, ghost) typography/ — Eyebrow, DisplayHeading, SectionHeader cards/ — ServiceCard, InfraCard, ValueCard, TopicCard data/ — StatItem, ResultRow, ClientLogo content/ — TestimonialCard, ProcessStep, KeyTakeaways, ArticleRow disclosure/ — Accordion forms/ — Input, Select, Textarea feedback/ — Modal, TrustToast, GuaranteeBanner navigation/ — NavBar, Footer, MenuOverlay

Intentional additions

Not built (deliberately)

The site has no Tabs, Toast queue, Tooltip, Badge, Switch, Checkbox, Radio, Pagination, Breadcrumb or Table. Do not add them.


Known discrepancies (CSS wins)

Read these before trusting DESIGN-SYSTEM.md alone:

  1. Eyebrows are not mono. The doc says owners-mono for eyebrows, labels and button text. A late override in surface.css maps every label to DM Sans 10px / 700 / UPPERCASE / no tracking, and .surface-mono itself now resolves to --font-body. The tokens keep --font-mono for fidelity, but nothing renders in it.
  2. owners-mono has no font file. The live site never loads one either; it falls back to generic monospace. No substitute has been made — see Font caveats.
  3. .surface-display is not uppercase. The base rule sets text-transform: uppercase, but the site-level rule resets it to none and adds letter-spacing: 2px. Headlines are sentence case.
  4. --btn-radius is a pill, --fs-monumental (288px) is unused on any current page.

Font caveats


Index

Path What
styles.css Entry point — @import list only. Consumers link this one file.
tokens/fonts.css @font-face declarations + Unbounded fallback import
tokens/colors.css Raw palette, semantic tokens, light/dark theme scopes
tokens/typography.css Families, type scale, line-heights
tokens/spacing.css Spacing scale, gutter, content max, divider weights
tokens/motion.css Durations and easings
tokens/buttons.css Button tokens and the four treatments
tokens/base.css Reset, selection colour, the global image-radius rule
tokens/utilities.css .surface-display, .text-body, .s-eyebrow, layout and panel classes
components/ 25 React primitives — see the Components list above
guidelines/ 17 specimen cards (Colors, Type, Spacing, Brand, Motion)
ui_kits/website/ Clickable recreation of the marketing site — home, service, case studies, insight
assets/logos/ Surface marks and client logos
assets/images/ Photography and product screenshots
assets/fonts/ DM Sans woff2
SKILL.md Agent Skills entry point